﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Datos;
using Negocio.clases_tontas;
using Negocio.catalogos;

namespace Negocio.catalogos
{
    public class catalogoCabecera
    {
        ControlAsistenciaEntities _objConexion = new ControlAsistenciaEntities();


        /// <summary>
        /// Método para obtener la cabecera de la asistencia
        /// </summary>
        /// <returns>Lista cabcera</returns>
        public List<cabecera> obtenerCabecera()
        {
            List<cabecera> _objListaCabecera = new List<cabecera>();
            try
            {
                foreach (var item in _objConexion.procconsultarCabecera())
                {
                    _objListaCabecera.Add(new cabecera(item.idCabecera, new catalogoHorario().obtenerHorarioxID((int)item.idDetalleHorario).First(), (DateTime)item.fechaCabecera, (bool)item.protegida, (int)item.idObservacion));
                }
                return _objListaCabecera;
            }
            catch (Exception)
            {
                return _objListaCabecera;
            }
        }

        /// <summary>
        /// Método para obtener la lista de cabecera filtrado por ID
        /// </summary>
        /// <param name="_idCabecera">Código Cabecera</param>
        /// <returns>Lista de Cabecera</returns>
        public cabecera obtenerCabeceraXID(int _idCabecera)
        {
            cabecera _objListaCabecera = null;
            try
            {
                var item = _objConexion.procconsultarCabeceraXID(_idCabecera).First();
                if (item != null)
                {
                    _objListaCabecera = new cabecera(item.idCabecera, new catalogoHorario().obtenerHorarioxID((int)item.idDetalleHorario).First(), (DateTime)item.fechaCabecera, (bool)item.protegida, item.observacion);

                    return _objListaCabecera;
                }
                else
                {
                    return _objListaCabecera;
                }
            }
            catch (Exception)
            {
                return _objListaCabecera;
            }

        }

        public List<cabecera> obtenerCabeceraXIdDistribucionANDidPerido(int _idDistribcion, int _idPeriodo)
        {
            List<cabecera> _objListaCabecera = new List<cabecera>();
            try
            {
                foreach (var item in _objConexion.procconsultarCabeceraXIdDistribucionANDIdPeriodo(_idDistribcion, _idPeriodo))
                {
                    _objListaCabecera.Add(new cabecera(item.idCabecera, new catalogoHorario().obtenerHorarioxID((int)item.idDetalleHorario).First(), (DateTime)item.fechaCabecera, (bool)item.protegida, item.OBSERVACION));
                }
                return _objListaCabecera;
            }
            catch (Exception)
            {
                return _objListaCabecera;
            }
        }
        public List<cabecera> obtenerCabeceraXIdDistribucionANDidPeridoLimpia(int _idDistribcion, int _idPeriodo)
        {
            List<cabecera> _objListaCabecera = new List<cabecera>();
            try
            {
                foreach (var item in _objConexion.procconsultarCabeceraXIdDistribucionANDIdPeriodo(_idDistribcion,_idPeriodo))
                {
                    _objListaCabecera.Add(new cabecera(item.idCabecera, new catalogoHorario().obtenerHorarioxIDLimpia((int)item.idDetalleHorario).First(), (DateTime)item.fechaCabecera, (bool)item.protegida, item.OBSERVACION));
                }
                return _objListaCabecera;
            }
            catch (Exception)
            {
                return _objListaCabecera;
            }
        }

        public List<cabecera> obtenerCabeceraXIdDistribucionANDidPeridoXFecha(int _idDistribcion, int _idPeriodo, DateTime _fecha)
        {
            List<cabecera> _objListaCabecera = new List<cabecera>();
            try
            {
                foreach (var item in _objConexion.procconsultarCabeceraXIdDistribucionANDIdPeriodoANDFecha(_idDistribcion, _idPeriodo, _fecha))
                {
                    _objListaCabecera.Add(new cabecera(item.idCabecera, new catalogoHorario().obtenerHorarioxID((int)item.idDetalleHorario).First(), (DateTime)item.fechaCabecera, (bool)item.protegida, item.OBSERVACION));
                }

                return _objListaCabecera;
            }
            catch (Exception)
            {
                return _objListaCabecera;
            }
        }

        public List<cabecera> obtenerCabeceraXIdDistribucionANDidPeridoXFechaLimpia(int _idDistribcion, int _idPeriodo, DateTime _fecha)
        {
            List<cabecera> _objListaCabecera = new List<cabecera>();
            try
            {
                foreach (var item in _objConexion.procconsultarCabeceraXIdDistribucionANDIdPeriodoANDFecha(_idDistribcion, _idPeriodo, _fecha))
                {
                    _objListaCabecera.Add(new cabecera{ idCabecera= item.idCabecera, idDetalleHorario =  new catalogoHorario().obtenerHorarioxIDLimpia((int)item.idDetalleHorario).First(), fechaCabecera = (DateTime)item.fechaCabecera, protegido= (bool)item.protegida,  observacion= item.OBSERVACION});
                }

                return _objListaCabecera;
            }
            catch (Exception)
            {
                return _objListaCabecera;
            }
        }
        /// <summary>
        /// Método para ingresar la cabcera a la base de datos
        /// </summary>
        /// <param name="_cabecera">Objeto cabecera</param>
        /// <returns>Id del registro ingresado</returns>
        public int insertarCabecera(cabecera _cabecera)
        {
            try
            {                
                return int.Parse(_objConexion.procagregarCabecera(_cabecera.idCabecera, _cabecera.idDetalleHorario.idDetalleHorario, _cabecera.fechaCabecera, _cabecera.protegido, _cabecera.idObservacion).First().ToString());
            }
            catch (Exception)
            {
                return 0;
            }
        }

        public bool protegerCabecera(int _idCabecera, bool _proteger)
        {
            try
            {
                _objConexion.procProtegerCabecera(_proteger, _idCabecera);
                return true;
            }
            catch (Exception)
            {

                return false;
            }
        }
        public bool cambiarEstadoCabecera(int _idCabecera, int idObservacion)
        {
            try
            {
                _objConexion.procModificarCabecera(_idCabecera, idObservacion);
                return true;
            }
            catch (Exception)
            {

                return false;
            }
        }

        public int obtenerHorasTrabajadasAcumuladas(int _idDistribucion, int _idPeriodo)
        {
            try
            {
                DateTime dia = DateTime.Now;
                int nroHoraDistribucion = default(int), totalhoras = default(int) ;

                var resultCabecera = obtenerCabeceraXIdDistribucionANDidPerido(_idDistribucion, _idPeriodo);
                foreach (var item in resultCabecera)
                {
                    DateTime diaHora = DateTime.Now; //Obtiene dia actual

                    TimeSpan _intervaloHoraEntrada = TimeSpan.Parse(item.idDetalleHorario.horaEntrada);
                    TimeSpan _intervaloHoraSalida = TimeSpan.Parse(item.idDetalleHorario.horaSalida);

                    DateTime dia1 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0);  //Hora Inicio 
                    DateTime dia2 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin
                    nroHoraDistribucion = (dia2.Subtract(dia1)).Hours;
                    totalhoras = totalhoras + nroHoraDistribucion;                    
                }
                return totalhoras;
            }
            catch (Exception)
            {
                return -1;
            }
        }
        public int obtenerHorasTrabajadasMesActual(int _idDistribucion, int _idPeriodo, DateTime mesActual)
        {
            try
            {
                DateTime dia = DateTime.Now;
                int nroHoraDistribucion = default(int), totalhoras = default(int);

                var resultCabecera = (from item in obtenerCabeceraXIdDistribucionANDidPerido(_idDistribucion, _idPeriodo)
                                     where item.fechaCabecera.Month == mesActual.Month
                                     select item).ToList();

                foreach (var item in resultCabecera)
                {
                    DateTime diaHora = DateTime.Now; //Obtiene dia actual


                    TimeSpan _intervaloHoraEntrada = TimeSpan.Parse(item.idDetalleHorario.horaEntrada);
                    TimeSpan _intervaloHoraSalida = TimeSpan.Parse(item.idDetalleHorario.horaSalida);

                    DateTime dia1 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0);  //Hora Inicio 
                    DateTime dia2 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin                    
                    
                    nroHoraDistribucion = (dia2.Subtract(dia1)).Hours;
                    totalhoras = totalhoras + nroHoraDistribucion;
                }
                return totalhoras;
            }
            catch (Exception)
            {
                return -1;

            }
        }

        public List<cabecera> obtenerCabeceraXIdDistribucionANDidPeridoFiltradoColumnas(int _idDistribcion, int _idPeriodo)
        {
            DateTime _diaTemporal = new DateTime();

            List<cabecera> _objListaCabecera = new List<cabecera>();
            try
            {
                var resulCabecera = _objConexion.procconsultarCabeceraXIdDistribucionANDIdPeriodo(_idDistribcion, _idPeriodo).OrderBy(C => C.fechaCabecera).ToList();
                if (resulCabecera.Count != 0)
                {
                    foreach (var item in resulCabecera)
                    {
                        if (!(_diaTemporal.Date == item.fechaCabecera.Value.Date))
                        {
                            _objListaCabecera.Add(new cabecera(item.idCabecera, new catalogoHorario().obtenerHorarioxID((int)item.idDetalleHorario).First(), (DateTime)item.fechaCabecera, (bool)item.protegida, item.OBSERVACION));
                        }
                        _diaTemporal = (DateTime)item.fechaCabecera.Value;                        
                    }
                } 
               
                return _objListaCabecera;
            }
            catch (Exception)
            {
                return _objListaCabecera;
            }
        }

    }
}
